JIT 컴파일러
부트캠프때 자바스크립트라는 언어를 배울때 자바스크립트는 인터프리터
언어이다 라고 배웠던 기억이 있다.
하지만 자바스크립트의 시초는 인터프리터
언어라고 할수있지만 현대의 자바스크립트 엔진은 인터프리터
의 기능뿐 아니라 컴파일
하는 기능까지 보유 하고 있다.
인터프리터
와 컴파일러
의 차이
먼저 인터프리터
는 한덩어리를 잡고 번역한다기 보다 한줄한줄씩 바로바로 실행시켜 작동을 하는 방식이다. 이 방식은 코드가 한줄한줄 독자적으로 실행되다 보니 컴파일 과정이 없어 테스트가 빠르다는
장점이 있다.
컴파일러
는 프로그래밍 언어로 작성된 파일을 통째로 기계어로 번역하는 컴파일 과정을 거쳐서 실행을 시킨다. 통째로 번역하다보니 속도가 빠르고
메모리 사용량이 상대적으로 적은
장점을 가지고 있습니다.
자바스크립트의 과거 스펙에서 현대의 자바스크립트로 넘어오면서 현대 웹 브라우저에 탑재된 자바스크립트 엔진중에 가장 유명한 V8
엔진의 출시때 코드를 읽어가는 과정에서 상대적으로 느리고 메모리 사용량을 많이 사용하는 인터프리터 기반의 구동 방식에서 Profiler
와 Turbo Fan
을 추가합니다.
Profiler
가 하는일은 간단합니다 반복문 이나 자주 등장하는 함수 같이 여러번 실행된 코드들에 대한 정보를 수집해 ( 타입정보, 실행횟수등 ) 반복 횟수가 많다 싶으면 이를 핫 코드
로 지정하고 Turbo Fan
에게 넘깁니다.
그럼 Turbo Fan
은 받아온 Profiling Data
를 활용해 동적 타입을 정적 타입으로 감지하여 최적화 시키는 Type Specialization
나 반복 횟수가 적은 반복문을 Loop Unrolling
시키거나 인라인 캐싱 기능등 최적화된 방식으로 메모리에 저장시켜놨다가 동일한 코드가 등장할시 인터프리팅 과정을 거치지않고 등록된 메모리에서 꺼내 이를 제공하는 과정을 거칩니다.
요약하자면 자바스크립트는 본래 인터프리터 언어였지만 현대 웹에서 요구사항이 높아지며 최적화를 위해 인터프리팅 도중 중복되는 코드를 감지하고 이를 최적화 시키는 컴파일러도 있다는 점을 알았습니다.
이를 JIT(Just-In-Time)컴파일러
라고 하며 자바스크립트가 어떤식으로 동작하여 실행되는지 다시한번 머리에 저장을 하였습니다.